package ar.uba.is2.ec.matem;

import java.util.Collection;

import org.apache.log4j.Logger;

import ar.uba.is2.common.threads.ThreadManager;
import ar.uba.is2.ec.config.ClavesConfiguracion;
import ar.uba.is2.ec.config.Contexto;
import ar.uba.is2.ec.matem.dao.MedicionDao;
import ar.uba.is2.ec.matem.modelo.Medicion;
import ar.uba.is2.ec.matem.motor.MotorDeReglas;

public class ModeloMatematico {
	
	private static final Logger logger = Logger.getLogger(ModeloMatematico.class);

	private MedicionDao medicionDao;
	private MotorDeReglas motorDeReglas;
	private long sleepTime;

	public ModeloMatematico(MedicionDao medicionDao, MotorDeReglas motorDeReglas) {

		this.medicionDao = medicionDao;
		this.motorDeReglas = motorDeReglas;
		this.sleepTime = Long.parseLong(Contexto.instance.get("modelo.matematico.exec.time"));

		DaemonModelo modelo = new DaemonModelo();
		ThreadManager.instance.crearYCorrerThread(modelo);
	}

	private class DaemonModelo implements Runnable {

		public synchronized void run() {
			while (true) {
				try {
					this.wait(ModeloMatematico.this.sleepTime);

					logger.info("Corriendo modelo matematico");

					Collection<Medicion> ultimasMediciones = ModeloMatematico.this.medicionDao
							.obtenerUltimasMediciones();
					
					EstadoMeteorologico estadoMeteorologico = motorDeReglas
							.calcularEstado(ultimasMediciones);

					switch (estadoMeteorologico) {
					case LLUVIA:
						System.out.println(Contexto.instance
								.get(ClavesConfiguracion.ALERTA_LLUVIA));
						break;
					case SOL:
						System.out.println(Contexto.instance
								.get(ClavesConfiguracion.ALERTA_SOL));
						break;
					case HURACAN:
						System.out.println(Contexto.instance
								.get(ClavesConfiguracion.ALERTA_HURACAN));
						break;
					case EXPLOSION_PLANETARIA:
						System.out
								.println(Contexto.instance
										.get(ClavesConfiguracion.ALERTA_EXPLOSION_PLANETARIA));
						break;
					case SIN_RESULTADO:
						System.out.println(Contexto.instance
								.get(ClavesConfiguracion.SIN_RESULTADO));
						break;

					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}
